//
//  NWPictureBrowserCell.swift
//  Weibo01
//
//  Created by 牛威 on 15/12/16.
//  Copyright © 2015年 牛威. All rights reserved.
//

import UIKit
import SDWebImage
import SVProgressHUD

/**
 
 thumbnail_pic	string	缩略图片地址，没有时不返回此字段
 bmiddle_pic	string	中等尺寸图片地址，没有时不返回此字段
 original_pic	string	原始图片地址，没有时不返回此字段
 
 
 */
 
 
 //MARK: - 设置用手点击照片就消失的协议


protocol NWPictureBrowserCellDelegate : NSObjectProtocol {

       //MARK: -点击照片就消失的方法
       func pictureBrowserCellDelegate()
    
       //用手捏合照片就会产生放大或缩小的效果
    func pictureBrowserDidZoomDelegate(scale : CGFloat)
 

}
 


//MARK: - 由于cell中的逻辑很复杂,所以单独创建一个文件出来,钥匙逻辑简单就可以类中类

class NWPictureBrowserCell: UICollectionViewCell {
    
   //MARK: - 设置代理属性
    
     var pictureDelegate : NWPictureBrowserCellDelegate?
    
    
    
//MARK: - 点击照片就消失的监听方法
    
    @objc private func tapImage(){
    
    pictureDelegate?.pictureBrowserCellDelegate()
        
        
        
    }
    
    //MARK: - 设置属性
    
    var imageUrl : NSURL?{
        
        
        didSet{
            
            //每次加载之前重置scroll
            
            resetScroll()

            
            guard let url = imageUrl else{
            
              return
            }
            
            //从磁盘读取缩略图片
            
          let placeImage = SDWebImageManager.sharedManager().imageCache.imageFromDiskCacheForKey(url.absoluteString)
            
            
            
            setPlaceholderImage(placeImage)
            
            
            imageView.sd_setImageWithURL(bmiddleUrl(url), placeholderImage: nil,
                options: [SDWebImageOptions.RetryFailed,SDWebImageOptions.RefreshCached],
                progress: {
                (current, total) -> Void in
                    
//                    print("\(current),\(total)")
                    
                    //传递进度条内容
                    
                    dispatch_async(dispatch_get_main_queue(), { () -> Void in
                        
                        self.placeHolderImage.progressNum = CGFloat(current / total)
                    })
                
                
                }) { (image, _, _, _) -> Void in
                    
                    //判断image为nil
                    
                    if image == nil {
                    
                        SVProgressHUD.showInfoWithStatus("您的网络不给力,图片加载失败")
                    
                      return
                    }
                    
                    //隐藏占位图
                    
                  self.placeHolderImage.hidden = true
                  self.setPosition(image)
 
            }
            
            
            //异步加载图片 异步加载大图,之后为什么没有缩略图了? sd_image有一个功能,一旦设置了url,准备异步加载
            //清楚之前的图片,如果之前的图片也是异步下载,但是没有完成,取消之前的下载,
            
//           imageView.sd_setImageWithURL(bmiddleUrl(url)) { (image, _, _, _) -> Void in
//            
//            
//                    self.setPosition(image)
//            }
        
        }
    
    }
    
    
    //MARK: - 设置占位小图(参数 --->当网络不好的时候可能穿传来的是空)
    
    private func setPlaceholderImage(image:UIImage?){
        
        //TODO: - 这个不需要设置把?
        
        placeHolderImage.hidden = false
    
        placeHolderImage.image = image
        
        placeHolderImage.sizeToFit()
        
        placeHolderImage.center = scroll.center
        

    
    }
    
    //MARK: - 重置scroll的属性 -->解决cell的重用,当你放大了第一张图之后,第二章可以完整显示,但是第三张就会在屏幕之后
    //原因就是contentSize被放大了
    
    private func resetScroll(){
     
        //MARK: - 重设imageView的属性 解决第三张图不能放大的问题
        
        imageView.transform = CGAffineTransformIdentity
        
    
        scroll.contentInset = UIEdgeInsetsZero
        scroll.contentSize = CGSizeZero
        scroll.contentOffset = CGPointZero
    
    }
    
    //MARK: - 设置图片的尺寸
    
    private func setPosition(image:UIImage){
        
        let size = self.displaySize(image)

        
        
        if size.height < scroll.bounds.height { //上下居中显示
            //一旦调整x/y,缩放的时候就会影响滚动范围
        
            imageView.frame = CGRect(x: 0, y: 0, width: size.width, height: size.height)
            
             let y = (scroll.bounds.height - size.height) * 0.5
            //设置完就可以展示最下边
            scroll.contentInset = UIEdgeInsets(top: y, left: 0, bottom: 0, right: 0)
        
        }else {
          
            imageView.frame = CGRect(x: 0, y: 0, width: size.width, height: size.height)
        
            scroll.contentSize = imageView.size
        
        }

    
    }
    
    
    //MARK: - 返回等比例的size
    
    /// 根据scroll的宽度等比例缩放之后的图片尺寸
    ///
    /// - parameter image: 传过来的图片
    ///
    /// - returns: 返回缩放之后的size
    
    private func displaySize(image : UIImage)->CGSize {
    
        let w = scroll.bounds.width
        
        let h = image.size.height * w / image.size.width
        
        return CGSize(width: image.size.width, height: h)
      
    
    
    }
    
    //MARK: - 返回中等图url

    /// 把传过来的url,转换为中等图的url
    ///
    /// - parameter imageUrl: 缩略图url
    ///
    /// - returns: 中等图url
    
    private func bmiddleUrl(imageUrl : NSURL)->NSURL{
    
       var str = imageUrl.absoluteString
        
      str = str.stringByReplacingOccurrencesOfString("/thumbnail/", withString: "/bmiddle/")
      
        return NSURL(string: str)!
    }
    
    //MARK: - 构造函数
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        setupUI()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    
    //MARK: - 设置界面
    
    private func setupUI(){
    
        contentView.addSubview(scroll)
        scroll.addSubview(imageView)
        scroll.addSubview(placeHolderImage)
        //不设置尺寸,不显示
        
        //TODO: - 解决两张相邻照片之间的间距问题
        
        var rect = bounds
        
        rect.size.width -= 20

        scroll.frame = rect
        
        
        //缩放图片
        
        scroll.minimumZoomScale = 0.5
        scroll.maximumZoomScale = 2
        scroll.delegate = self
        
        //往imageView上添加手势
        
        let tap = UITapGestureRecognizer(target: self, action: "tapImage")
        
        //注意:imageView默认是关闭用户交互的 
        
        imageView.userInteractionEnabled = true
        
        imageView.addGestureRecognizer(tap)
        
    
    }
 
    
    //MARK: - 懒加载控件
    
    /// 背景图
    
     lazy var scroll : UIScrollView = UIScrollView()
    
    /// 显示大图的imageView
    
     lazy var imageView : UIImageView = UIImageView()
    
    /// 占位图片 //TODO: - 这里会提示没有参数不能进行初始化--->修改NWProgressView的构造函数

    
    private lazy var placeHolderImage : NWProgressView = NWProgressView()
    
}

extension NWPictureBrowserCell : UIScrollViewDelegate {

    //只要写了这个方法 就可以实现缩放

    func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
        
        return imageView
    }
    
    //缩放完成会调用一次
    ///
    /// - parameter scrollView: scroll
    /// - parameter view:       被缩放的视图
    /// - parameter scale:      被缩放的比例 view的bounds不会变 变的只是transform
    
    func scrollViewDidEndZooming(scrollView: UIScrollView, withView view: UIView?, atScale scale: CGFloat) {
        
        if scale < 1 {
        
          pictureDelegate?.pictureBrowserCellDelegate()
            return
        
        }
        
         var offsetY = (scroll.bounds.height - (view?.frame.height)!) * 0.5
        
         offsetY =   offsetY < 0 ? 0 : offsetY
        
        
        var offsetX = (scroll.bounds.width - (view?.frame.width)!) * 0.5
        
        offsetX =  offsetX < 0 ? 0 :offsetX
        
        //contentInset调整空间位置,不会影响滚动
        
        scroll.contentInset = UIEdgeInsets(top: offsetY, left: offsetX, bottom: 0, right: 0)

        
        
    }
    
    //只要缩放就会调用
    
    func scrollViewDidZoom(scrollView: UIScrollView) {
        
      pictureDelegate?.pictureBrowserDidZoomDelegate(imageView.transform.a)
    }



}
